package ch.eureka.consumer.ribbon.command;

import com.netflix.hystrix.*;
import com.netflix.hystrix.strategy.concurrency.HystrixConcurrencyStrategyDefault;
import org.springframework.web.client.RestTemplate;

/**
 * 自定义的Command 继承形式
 */
public class StringCommand extends HystrixCommand<String> {

    private RestTemplate restTemplate;
    private static final HystrixCommandKey GETTER_KEY = HystrixCommandKey.Factory.asKey("command名称");

    protected StringCommand() {
        super(Setter.withGroupKey(HystrixCommandGroupKey.Factory.asKey("command名称"))
                .andThreadPoolKey(HystrixThreadPoolKey.Factory.asKey("线程池名称")));
    }

    @Override
    protected String run() throws Exception {
        return restTemplate.getForEntity("", String.class).getBody();
    }

    @Override
    protected String getFallback() {
        return super.getFallback();
    }

    /**
     * 缓存请求结果
     *      1.减少重复的请求数，降低依赖服务的并发度
     *      2.同一用户请求的上下文中，相同依赖服务的返回数据始终保持一致
     *      3.请求缓存在run()和构造之前，可以减少不必要的线程开销
     * @return
     */
    @Override
    protected String getCacheKey() {
        // 例如通过ID查找用户信息，此时缓存ID进入，当下次请求ID重复时，直接返回缓存的结果
        return super.getCacheKey();
    }

    /**
     * 当外部调用的时候，有写入操作需要更新数据的时候，可以调用此方法清除缓存
     * @param id
     */
    public static void flushCache(Long id){
        HystrixRequestCache.getInstance(GETTER_KEY,
                HystrixConcurrencyStrategyDefault.getInstance()).clear(String.valueOf(id));
    }
}
